考点:文件包含、二次注入、sql注入读取文件
这道题本来打算自己折腾出来的,把源代码包含出来后,一直审计,起初,根本没发现是二次注入,一直在想办法绕过addslashes
和 怎么绕过正则,正则过滤了很多sql注入的关键字,只能检测有sql注入漏洞,但根本不可能查到数据。就是在这上面下的功夫比较多。最后才发现,文件change.php
有一个查询sql语句,带入查询的sql语句关键字被过滤了,在查询出来的基础上,紧接着有一条更新语句,更新语句是有一个条件是从数据库中取出,也就是$row['address']
,然后找到这个$row['address']
插入的地方,也就是首页index.php
,后台处理是 confirm.php
, 发现没有处理 $address
,于是就知道这个题考的二次注入。知道以后,可以查询表名,字段名,就是查不到字段值,网上找个了遍,群里也问了哪些大佬,都没有得到结果,最后才看来wp,发现flag根本不在数据库中,而是在 /falg.txt
中,简直人傻了。
分析
主页上一个关键的地方,可以用文件包含出几个文件的源代码。
payload
1 | ?file=php://filter/read=convert.base64-encode/resource=index.php |
confirm.php
1 | <?php |
change.php
1 | <?php |
贴了两个关键文件的代码,总共有四个功能提交订单
查询订单
修改订单
删除订单
漏洞出现在提交订单
和 修改订单
当中,直接构造payload。
payload
查数据库
1 | aa' or updatexml(2,concat(0x7e,(database())),0) or' |
加载flag文件
1 | aa' or updatexml(2,concat(0x7e,(select load_file('/flag.txt'))),0) or' |
读不完
一次
1 | # 一次 |
测试
把查数据库的payload提交上去
再修改订单信息
成功的拿到了数据库名
接下来直接读flag,为什么不是放在数据库中,我也是不断的读取字段名,读了差不多20多个字段名,一直读不完,才去看别人wp,发现要用load_file 去读 /flag.txt 文件。
提交
修改
拿到flag,但是并没有全拿到。
再读一次,就拿到后半段。
1 | aa' or updatexml(2,concat(0x7e,(select substr(load_file('/flag.txt'),20,50))),0) or' |